aboutsummaryrefslogtreecommitdiffstats
path: root/src/routes/(app)/[username]/generate/+page.svelte
blob: bd72592ff17cc07762b0f60451768a6fdab5ef49 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<script>
	import { fail, post, wait } from '$lib/utils';
	import { Buffer } from 'buffer';
	import { onMount } from 'svelte';
	import { bech32m } from 'bech32';
	import { generateMnemonic, mnemonicToEntropy, mnemonicToSeedSync } from 'bip39';
	import { goto, invalidate } from '$app/navigation';
	import { Pin } from '$comp';
	import { loginRedirect, pin, password, passwordPrompt } from '$lib/store';
	import { generate } from '$lib/nostr';
	import { browser } from '$app/environment';

	export let data;
	let { user } = data;

	let loaded;
	let gen = async () => {
		if (!browser) return;
		setTimeout(() => (loaded = true), 50);

		if (!$password) $passwordPrompt = true;

		try {
			await post('/password', { password: $password });
		} catch (e) {
			$passwordPrompt = true;
		}

		await wait(() => $password);

		try {
			await generate(user);
		} catch (e) {
			console.log('error generating', e);
		}

		try {
			user.pin = $pin;
			await post(`/${user.username}/generate`, user);
			goto($loginRedirect || `/${user.username}/dashboard`, { invalidateAll: true });
		} catch (e) {
			$pin = '';
			if (e.message?.startsWith('Pin')) {
				fail('Wrong pin, try again');
			} else {
				fail('Failed to generate keys');
				goto('/');
			}
		}
	};

	onMount(async () => {
		await gen();
	});

	$: $pin?.length === 6 && gen(user);
</script>

{#if loaded && user?.haspin && $pin?.length !== 6}
	<Pin />
{/if}